package com.cv.platform.service.video;

import com.cv.framework.common.pojo.PageResult;
import com.cv.platform.controller.audit.video.vo.AuditVideoPageReqVO;
import com.cv.platform.controller.audit.video.vo.AuditVideoSaveReqVO;
import com.cv.platform.controller.platform.collection.vo.collection.CvVideoCollectionDetailPageReqVO;
import com.cv.platform.controller.platform.video.vo.CvVideoItemRespVO;
import com.cv.platform.controller.platform.video.vo.CvVideoItemTypeRespVO;
import com.cv.platform.controller.platform.video.vo.detail.CvVideoDetailRespVO;
import com.cv.platform.controller.platform.video.vo.menu.CvVideoMenuReqVO;
import com.cv.platform.controller.platform.video.vo.profile.CvVideoProfileReqVO;
import com.cv.platform.controller.platform.video.vo.profile.CvVideoUncollectedReqVO;
import com.cv.platform.controller.platform.video.vo.profile.CvVideoUncollectedRespVO;
import com.cv.platform.controller.platform.video.vo.video.CvVideoReqVO;
import com.cv.platform.controller.platform.video.vo.video.CvVideoSaveReqVO;
import com.cv.platform.controller.system.dashboard.vo.VideoTypeCountData;
import com.cv.platform.dal.dataobject.video.CvVideoDO;

import java.util.List;

/**
 * 视频业务层接口
 *
 * @author Charles_XDXD
 */
public interface CvVideoService {

    /**
     * 获取热门推荐视频
     *
     * @return 热门推荐视频
     */
    List<CvVideoItemRespVO> getVideoHotRecommend();

    /**
     * 获取其它类型的热门推荐
     *
     * @return 其它类型的热门推荐
     */
    List<CvVideoItemTypeRespVO> getVideoTypeHotRecommend();

    /**
     * 获取所有没有被删除、审核已通过并且没有隐藏的视频数据
     *
     * @return 所有没有被删除、审核已通过并且没有隐藏的视频数据
     */
    List<CvVideoItemRespVO> getAllAllowedVideo();

    /**
     * 获取推荐视频列表
     *
     * @param videoId 视频编号
     * @return 推荐视频列表
     */
    List<CvVideoItemRespVO> getRecommendVideoList(Long videoId);

    /**
     * 根据视频编号获取视频信息
     *
     * @param videoId 视频编号
     * @return 视频信息
     */
    CvVideoDO getVideoById(Long videoId);

    /**
     * 新增视频播放量
     */
    void addVideoViewCount(Long videoId);

    /**
     * 新增评论数量
     */
    void addVideoCommentCount(Long videoId);

    /**
     * 获取视频详情
     *
     * @param videoId 视频编号
     * @param isAudit 是否来自审核
     * @return 视频详情
     */
    CvVideoDetailRespVO getVideoDetail(Long videoId, boolean isAudit);

    /**
     * 筛选视频
     *
     * @param reqVO 分页查询请求对象
     * @return 分页数据
     */
    PageResult<CvVideoItemRespVO> getVideoPage(CvVideoMenuReqVO reqVO);

    /**
     * 查询用户视频
     *
     * @param reqVO 分页查询请求对象
     * @return 分页数据
     */
    PageResult<CvVideoItemRespVO> getUserVideoPage(CvVideoProfileReqVO reqVO);

    /**
     * 查询合集视频
     *
     * @param reqVO       分页查询请求对象
     * @param videoIdList 视频编号集合
     * @return 分页数据
     */
    PageResult<CvVideoItemRespVO> getCollectionVideoPage(CvVideoCollectionDetailPageReqVO reqVO, List<Long> videoIdList);

    /**
     * 获取未添加合集的视频
     *
     * @param reqVO 分页查询请求对象
     * @return 分页数据
     */
    PageResult<CvVideoUncollectedRespVO> getUncollectedVideoPage(CvVideoUncollectedReqVO reqVO);

    /**
     * 获取未收入合集的视频列表以及被当前合集收入的视频列表
     *
     * @param reqVO 分页查询请求对象
     * @return 分页数据
     */
    PageResult<CvVideoUncollectedRespVO> getUncollectedAndCurrent(CvVideoUncollectedReqVO reqVO);

    /**
     * 保存视频数据
     *
     * @param reqVO 视频数据
     * @return 视频编号
     */
    Long saveVideo(CvVideoSaveReqVO reqVO);

    /**
     * 审核视频
     *
     * @param reqVO 审核视频数据
     */
    void auditVideo(AuditVideoSaveReqVO reqVO);

    /**
     * 删除视频数据
     *
     * @param videoId 视频编号
     */
    void deleteVideo(Long videoId);

    /**
     * 删除所有视频
     * 
     * @param userId 用户编号
     */
    void deleteAllVideo(Long userId);

    /**
     * 获取视频分页数据（管理页）
     *
     * @param reqVO 查询参数
     * @return 视频分页数据
     */
    PageResult<CvVideoItemRespVO> getVideoOperationPage(CvVideoReqVO reqVO);

    /**
     * 获取视频详情（管理页）
     *
     * @param videoId 视频编号
     * @return 视频详情
     */
    CvVideoDetailRespVO getVideoOperationDetail(Long videoId);

    /**
     * 获取所有视频播放总数量
     * 
     * @return 视频播放总数量
     */
    Integer getVideoPV();

    /**
     * 获取各类型的视频数量
     * 
     * @return 视频数量
     */
    List<VideoTypeCountData> getVideoTypeCountData();

    /**
     * 获取所有待审核的视频
     * 
     * @param reqVO 查询参数
     * @return 视频分页数据
     */
    PageResult<CvVideoItemRespVO> getVideoAuditPage(AuditVideoPageReqVO reqVO);

    /**
     * 转码状态更新为待审核
     */
    void updateTranscodingToAuditing(Long url);

}
